/*-*
 * FILENAME  :
 *    $HeadURL$
 *
 * STATUS  :
 *    $Revision$
 *
 *    $Author$
 *    $Date$
 *  
 *    
 * Copyright (c) 2011 Gonalge Ltda. All rights reserved.
 *
 ****************************************************************/

package org.gonalge.arbolrojonegro.presentacion;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.Timer;

import java.awt.Font;
import java.awt.Panel;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import org.apache.commons.lang.math.NumberUtils;
import org.gonalge.arbolrojonegro.negocio.ArchivoEvaluacion;
import org.gonalge.arbolrojonegro.util.FormUtils;

/**
 * 
 * @author Geremias Gonzalez
 */
public class FormEvaluacion extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = -82072808097779846L;

    private final JPanel hoja = new JPanel();

    private final JSlider jSlider1 = new JSlider();

    private final JCheckBox pregunta1True = new JCheckBox();

    private final JCheckBox pregunta1False = new JCheckBox();

    private final JCheckBox pregunta2True = new JCheckBox();

    private final JCheckBox pregunta2False = new JCheckBox();

    private final JCheckBox pregunta3True = new JCheckBox();

    private final JCheckBox pregunta3False = new JCheckBox();

    private final JCheckBox pregunta4True = new JCheckBox();

    private final JCheckBox pregunta4False = new JCheckBox();

    private final JCheckBox pregunta5True = new JCheckBox();

    private final JCheckBox pregunta5False = new JCheckBox();

    private final JSpinner jSpinner1 = new JSpinner();

    private final JSpinner jSpinner2 = new JSpinner();

    private final JSpinner jSpinner3 = new JSpinner();

    private final JSpinner jSpinner4 = new JSpinner();

    private final JSpinner jSpinner5 = new JSpinner();

    private final Panel panel1 = new Panel();

    private final Panel panel2 = new Panel();

    private final Panel panel3 = new Panel();

    private final JLabel pregunta1 = new JLabel();

    private final JLabel pregunta2 = new JLabel();

    private final JLabel pregunta3 = new JLabel();

    private final JLabel pregunta4 = new JLabel();

    private final JLabel pregunta5 = new JLabel();

    private final JLabel pregunta6 = new JLabel();

    private final JLabel pregunta7 = new JLabel();

    private final JLabel pregunta8 = new JLabel();

    private final JLabel pregunta9 = new JLabel();

    private final JLabel pregunta10 = new JLabel();

    private final JSlider jSlider2 = new JSlider();

    private final JButton nuevo = new JButton();

    private final JButton calificacion = new JButton();

    private final JLabel notaLabel = new JLabel();

    private final JLabel tituloLabel = new JLabel();

    private final ArchivoEvaluacion evaluacion = new ArchivoEvaluacion();

    private final PintarArbol pintarArbol = new PintarArbol();

    private final JButton salir = new JButton();

    public FormEvaluacion() {
        try {
            jbInit();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private void jbInit() throws Exception {
        this.getContentPane().setLayout(null);
        this.setBounds(FormUtils.crearRectangle(this));
        this.setResizable(false);
        this.getContentPane().setBackground(FormUtils.getColorFondo());
        this.getContentPane().setLayout(null);
        this.setTitle("Tutor Arbol Rojo y Negro");

        evaluacion.cargarArbol();
        pintarArbol.setArbol(evaluacion.getArbol().actualizar(evaluacion.getArbol().getRaiz()));
        pintarArbol.setBounds(0, 0, 500, 500);

        evaluacion.cargarPregunta();
        evaluacion.preguntas();
        pregunta1.setText(evaluacion.getPregunta(0));
        pregunta2.setText(evaluacion.getPregunta(1));
        pregunta3.setText(evaluacion.getPregunta(2));
        pregunta4.setText(evaluacion.getPregunta(3));
        pregunta5.setText(evaluacion.getPregunta(4));
        pregunta6.setText(evaluacion.getPregunta(5));
        pregunta7.setText(evaluacion.getPregunta(6));
        pregunta8.setText(evaluacion.getPregunta(7));
        pregunta9.setText(evaluacion.getPregunta(8));
        pregunta10.setText(evaluacion.getPregunta(9));

        pintarArbol.setBounds(new Rectangle(-460, -20, 1000, 350));
        pintarArbol.setBackground(FormUtils.getColorFondo());
        hoja.setBounds(new Rectangle(35, 50, 525, 895));
        hoja.setLayout(null);
        hoja.setBackground(FormUtils.getColorFondo());

        FormUtils.updateJCheckBox(pregunta1True, 455, 30, true);
        pregunta1True.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pregunta1Action(true);
            }
        });
        FormUtils.updateJCheckBox(pregunta1False, 455, 30, false);
        pregunta1False.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pregunta1Action(false);
            }
        });

        FormUtils.updateJCheckBox(pregunta2True, 455, 115, true);
        pregunta2True.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pregunta2Action(true);
            }
        });
        FormUtils.updateJCheckBox(pregunta2False, 455, 115, false);
        pregunta2False.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pregunta2Action(false);
            }
        });

        FormUtils.updateJCheckBox(pregunta3True, 455, 200, true);
        pregunta3True.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pregunta3Action(true);
            }
        });
        FormUtils.updateJCheckBox(pregunta3False, 455, 200, false);
        pregunta3False.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pregunta3Action(false);
            }
        });

        FormUtils.updateJCheckBox(pregunta4True, 455, 285, true);
        pregunta4True.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pregunta4Action(true);
            }
        });
        FormUtils.updateJCheckBox(pregunta4False, 455, 285, false);
        pregunta4False.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pregunta4Action(false);
            }
        });

        FormUtils.updateJCheckBox(pregunta5True, 455, 370, true);
        pregunta5True.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pregunta5Action(true);
            }
        });
        FormUtils.updateJCheckBox(pregunta5False, 455, 370, false);
        pregunta5False.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pregunta5Action(false);
            }
        });

        FormUtils.updateJSpinner(jSpinner1, 455, 465);
        FormUtils.updateJSpinner(jSpinner2, 455, 550);
        FormUtils.updateJSpinner(jSpinner3, 455, 635);
        FormUtils.updateJSpinner(jSpinner4, 455, 720);
        FormUtils.updateJSpinner(jSpinner5, 455, 805);

        jSlider1.setBounds(new Rectangle(15, 50, 20, 655));
        jSlider1.setOrientation(JSlider.VERTICAL);
        jSlider1.setValue(0);
        jSlider1.setInverted(true);
        jSlider1.setBackground(FormUtils.getColorFondo());

        jSlider2.setBounds(new Rectangle(560, 30, 435, 20));
        jSlider2.setInverted(true);
        jSlider2.setBackground(FormUtils.getColorFondo());

        panel1.setBounds(new Rectangle(35, 0, 525, 50));
        panel1.setBackground(FormUtils.getColorFondo());
        panel1.setLayout(null);
        panel2.setBounds(new Rectangle(35, 705, 525, 40));
        panel2.setBackground(FormUtils.getColorFondo());
        panel3.setBounds(new Rectangle(560, 50, 450, 325));
        panel3.setLayout(null);

        FormUtils.updateLabelPregunta(pregunta1, 10, 25);
        FormUtils.updateLabelPregunta(pregunta2, 10, 110);
        FormUtils.updateLabelPregunta(pregunta3, 10, 195);
        FormUtils.updateLabelPregunta(pregunta4, 10, 280);
        FormUtils.updateLabelPregunta(pregunta5, 10, 365);
        FormUtils.updateLabelPregunta(pregunta6, 10, 450);
        FormUtils.updateLabelPregunta(pregunta7, 10, 535);
        FormUtils.updateLabelPregunta(pregunta8, 10, 620);
        FormUtils.updateLabelPregunta(pregunta9, 10, 705);
        FormUtils.updateLabelPregunta(pregunta10, 10, 790);

        FormUtils.updateButton(getClass(), nuevo, "nuevo1", "nuevo2", 700, 470);
        nuevo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                nuevo();
            }
        });

        FormUtils.updateButton(getClass(), calificacion, "calificar1", "calificar2", 820, 470);
        calificacion.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                calificacion();
            }
        });

        notaLabel.setBounds(new Rectangle(710, 580, 120, 30));
        notaLabel.setFont(new Font("Tahoma", 3, 20));
        notaLabel.setForeground(FormUtils.getColorTitulo());
        printNota(0);

        tituloLabel.setBounds(new Rectangle(115, 5, 285, 35));
        tituloLabel.setForeground(FormUtils.getColorTitulo());
        tituloLabel.setFont(new Font("Tahoma", 3, 24));
        tituloLabel.setText("HOJA DE EVALUACION");

        panel3.add(pintarArbol, null);
        tiempo.start();

        FormUtils.updateButton(getClass(), salir, "salir1", "salir2", 890, 630);
        salir.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                setVisible(false);
            }
        });

        panel1.add(tituloLabel, null);
        hoja.add(pregunta10, null);
        hoja.add(pregunta9, null);
        hoja.add(pregunta8, null);
        hoja.add(pregunta7, null);
        hoja.add(pregunta6, null);
        hoja.add(pregunta5, null);
        hoja.add(pregunta4, null);
        hoja.add(pregunta3, null);
        hoja.add(pregunta2, null);
        hoja.add(pregunta1, null);
        hoja.add(jSpinner5, null);
        hoja.add(jSpinner4, null);
        hoja.add(jSpinner3, null);
        hoja.add(jSpinner2, null);
        hoja.add(jSpinner1, null);
        hoja.add(pregunta5False, null);
        hoja.add(pregunta5True, null);
        hoja.add(pregunta4False, null);
        hoja.add(pregunta4True, null);
        hoja.add(pregunta3False, null);
        hoja.add(pregunta3True, null);
        hoja.add(pregunta2False, null);
        hoja.add(pregunta2True, null);
        hoja.add(pregunta1False, null);
        hoja.add(pregunta1True, null);

        this.getContentPane().add(salir);
        this.getContentPane().add(notaLabel, null);
        this.getContentPane().add(calificacion, null);
        this.getContentPane().add(nuevo, null);
        this.getContentPane().add(jSlider2, null);
        this.getContentPane().add(panel3, null);
        this.getContentPane().add(panel2, null);
        this.getContentPane().add(panel1, null);
        this.getContentPane().add(jSlider1, null);
        this.getContentPane().add(hoja);
    }

    Timer tiempo = new Timer(100, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

            hoja.setBounds(hoja.getX(), -2 * jSlider1.getValue() + 50, hoja.getWidth(), hoja.getHeight());
            pintarArbol.setBounds(-2 * jSlider2.getValue() - 380, pintarArbol.getY(), pintarArbol.getWidth(), pintarArbol.getHeight());
        }
    });

    private void calificacion() {
        evaluacion.cargarRespuestas(0, pregunta1True.isSelected());
        evaluacion.cargarRespuestas(1, pregunta2True.isSelected());
        evaluacion.cargarRespuestas(2, pregunta3True.isSelected());
        evaluacion.cargarRespuestas(3, pregunta4True.isSelected());
        evaluacion.cargarRespuestas(4, pregunta5True.isSelected());

        evaluacion.cargarRespuestas(5, NumberUtils.toInt(jSpinner1.getValue() + ""));
        evaluacion.cargarRespuestas(6, NumberUtils.toInt(jSpinner2.getValue() + ""));
        evaluacion.cargarRespuestas(7, NumberUtils.toInt(jSpinner3.getValue() + ""));
        evaluacion.cargarRespuestas(8, NumberUtils.toInt(jSpinner4.getValue() + ""));
        evaluacion.cargarRespuestas(9, NumberUtils.toInt(jSpinner5.getValue() + ""));

        printNota(evaluacion.nota());
    }

    private void nuevo() {
        evaluacion.cargarArbol();
        pintarArbol.setArbol(evaluacion.getArbol().actualizar(evaluacion.getArbol().getRaiz()));
        pintarArbol.pintar();
        evaluacion.cargarPregunta();
        evaluacion.preguntas();
        pregunta1.setText(evaluacion.getPregunta(0));
        pregunta2.setText(evaluacion.getPregunta(1));
        pregunta3.setText(evaluacion.getPregunta(2));
        pregunta4.setText(evaluacion.getPregunta(3));
        pregunta5.setText(evaluacion.getPregunta(4));
        pregunta6.setText(evaluacion.getPregunta(5));
        pregunta7.setText(evaluacion.getPregunta(6));
        pregunta8.setText(evaluacion.getPregunta(7));
        pregunta9.setText(evaluacion.getPregunta(8));
        pregunta10.setText(evaluacion.getPregunta(9));
        printNota(0);

    }

    private void pregunta1Action(boolean estado) {
        pregunta1False.setSelected(!estado);
        pregunta1True.setSelected(estado);
    }

    private void pregunta2Action(boolean estado) {
        pregunta2False.setSelected(!estado);
        pregunta2True.setSelected(estado);
    }

    private void pregunta3Action(boolean estado) {
        pregunta3False.setSelected(!estado);
        pregunta3True.setSelected(estado);
    }

    private void pregunta4Action(boolean estado) {
        pregunta4False.setSelected(!estado);
        pregunta4True.setSelected(estado);
    }

    private void pregunta5Action(boolean estado) {
        pregunta5False.setSelected(!estado);
        pregunta5True.setSelected(estado);
    }

    private void printNota(int nota) {
        notaLabel.setText("NOTA: " + nota);
    }

}
